package com.ygqh.baby.service.trustone.model;

import com.ygqh.baby.ao.PayType;
import com.ygqh.baby.model.OrderTaxes;
import com.ygqh.baby.service.trustone.TrustoneConfig;

import java.math.BigDecimal;

public class OrderRequestParamBuilder {

    private OrderRequestParam orderRequestParam;

    public OrderRequestParamBuilder(PayType payType) {
        super();
        this.orderRequestParam = new OrderRequestParam();
        this.buildPlatformParam(payType);
    }

    /**
     * 构建平台级参数
     *
     * @param payType
     * @return void    返回类型
     * @throws
     * @Title: BuildPlatformParam
     * ebusinessQstcode 电商企业全速通编码（由平台提供） String 40 true
     * logisticsQstcode 物流企业全速通编号（由平台提供） String 40 true
     * paymentQstcode 支付企业全速通编号（由平台提供） String 40 true
     * declarationQstcode 报关企业全速通编号（由平台提供） String 40 true
     * storageQstcode 仓储企业全速通编号（由平台提供） String 40 true
     * portQstcode 申报口岸全速通编号（由平台提供） String 40 true
     * supplierQstcode 供应商企业全速通编号（由平台提供） String 40 false
     * @author （guohao）
     * @date 2018年6月28日 下午4:05:20
     * @version V1.0
     */
    private void buildPlatformParam(PayType payType) {
        orderRequestParam.setEbusinessQstcode(TrustoneConfig.getEbusinessqstcode());
        /**
         * 全速通现在接口有改动，可以不推物流企业编码，由全速通来指定
         * 避免指定物流，而物流无法进区揽件的问题
         */

        orderRequestParam.setLogisticsQstcode(TrustoneConfig.getLogisticsqstcode());
        if (PayType.WeChat.equals(payType)) {
            orderRequestParam.setPaymentQstcode(TrustoneConfig.getPaymentqstcodeWechat());
        } else if (PayType.Alipay.equals(payType)) {
            orderRequestParam.setPaymentQstcode(TrustoneConfig.getPaymentqstcodeAlipay());
        }
        orderRequestParam.setDeclarationQstcode(TrustoneConfig.getDeclarationqstcode());
        orderRequestParam.setStorageQstcode(TrustoneConfig.getStorageqstcode());
        orderRequestParam.setSupplierQstcode(TrustoneConfig.getSupplierqstcode());
        orderRequestParam.setPortQstcode(TrustoneConfig.getPortqstcode());
    }

    /**
     * 构建推送状态
     *
     * @param isOrderPush   是否全速通推送订单（1:是, 0:否） Integer 4 true
     * @param isWaybillPush 是否全速通推送运单（1:是, 0:否） Integer 4 true
     * @param isPaymentPush 是否全速通推送支付单（1:是, 0:否） Integer 4 true
     * @return void    返回类型
     * @throws
     * @Title: buildPushStatus
     * @author （guohao）
     * @date 2018年6月28日 下午4:08:44
     * @version V1.0
     */
    public void buildPushStatus(int isOrderPush, int isWaybillPush, int isPaymentPush) {
        orderRequestParam.setIsOrderPush(isOrderPush);
        orderRequestParam.setIsWaybillPush(isWaybillPush);
        orderRequestParam.setIsPaymentPush(isPaymentPush);
    }

    /**
     * 构建获取状态
     *
     * @param isLogisticsObtain 是否代获取物流单号（1:是, 0:否） Integer 4 true
     * @param isPaymentObtain   是否代获取支付单号（1:是, 0:否） Integer 4 true
     * @return void    返回类型
     * @throws
     * @Title: buildObtain
     * @author （guohao）
     * @date 2018年6月28日 下午4:31:10
     * @version V1.0
     */
    public void buildObtainStatus(int isLogisticsObtain, int isPaymentObtain) {
        orderRequestParam.setIsLogisticsObtain(isLogisticsObtain);
        orderRequestParam.setIsPaymentObtain(isPaymentObtain);
    }

    /**
     * 构建订单编号
     * 商户订单号-对应- orderno
     * 微信支付单号-对应- paymentNo
     *
     * @param orderUuid   订单 uuid String 32 true
     * @param ordertype   订单类型(1:保税 2:直邮 3:国内) Integer 1 true
     * @param orderno     订单号码 String 30 true
     * @param logisticsNo 物流单号 String 30 true
     * @param paymentNo   支付单号 String 50 true
     * @return void    返回类型
     * @throws
     * @Title: buildOrderCode
     * @author （guohao）
     * @date 2018年6月28日 下午5:13:24
     * @version V1.0
     */
    public void buildOrderCode(String orderUuid, int ordertype, String orderno, String logisticsNo, String paymentNo) {
        orderRequestParam.setOrderUuid(orderUuid);
        orderRequestParam.setOrdertype(ordertype);
        orderRequestParam.setLogisticsNo(logisticsNo);
        orderRequestParam.setPaymentNo(paymentNo);
        orderRequestParam.setOrderno(orderno);
    }

    /**
     * 构建收货人信息
     *
     * @param receiverName
     * @param receiverPhone
     * @param receiverCountry
     * @param receiverProvince
     * @param receiverCity
     * @param receiverCounty
     * @param receiverAddress  入参
     * @return void    返回类型
     * @throws
     * @Title: buildReceiverInfo
     * @author （guohao）
     * @date 2018年6月28日 下午5:13:02
     * @version V1.0
     */
    public void buildReceiverInfo(String receiverName, String receiverPhone, String receiverCountry, String receiverProvince, String receiverCity, String
            receiverCounty, String receiverAddress) {
        orderRequestParam.setReceiverName(receiverName);
        orderRequestParam.setReceiverPhone(receiverPhone);
        orderRequestParam.setReceiverCountry(receiverCountry);
        orderRequestParam.setReceiverProvince(receiverProvince);
        orderRequestParam.setReceiverCity(receiverCity);
        orderRequestParam.setReceiverCounty(receiverCounty);
        orderRequestParam.setReceiverAddress(receiverProvince + receiverCity + receiverAddress);
    }

    /**
     * 构建收货人证件
     *
     * @param receiverIdType   收货人证件类型 String 1 false
     * @param receiverIdNumber 收货人证件号码 String 30 false
     * @return void    返回类型
     * @throws
     * @Title: buildReceiverId
     * @author （guohao）
     * @date 2018年6月28日 下午5:12:20
     * @version V1.0
     */
    public void buildReceiverId(String receiverIdType, String receiverIdNumber) {
        orderRequestParam.setReceiverIdType(receiverIdType);
        orderRequestParam.setReceiverIdNumber(receiverIdNumber);
    }

    /**
     * 构建支付人信息
     *
     * @param payerName     支付人姓名 String 64 true
     * @param payerIdType   支付人证件类型 String 1 true
     * @param payerIdNumber 支付人证件号码 String 30 true
     * @return void    返回类型
     * @throws
     * @Title: buildPayerInfo
     * @author （guohao）
     * @date 2018年6月28日 下午5:11:19
     * @version V1.0
     */
    public void buildPayerInfo(String payerName, String payerIdType, String payerIdNumber) {
        orderRequestParam.setPayerName(payerName);
        orderRequestParam.setPayerIdType(payerIdType);
        orderRequestParam.setPayerIdNumber(payerIdNumber);
    }

    /**
     * 构建购买人
     *
     * @param buyerName     购买人姓名 String 64 true
     * @param buyerAccount  购买人账号 String 30 true
     * @param buyerPhone    购买人电话 String 64 true
     * @param buyerIdType   购买人证件类型 String 1 true
     * @param buyerIdNumber 购买人证件号码 String 30 true
     * @return void    返回类型
     * @throws
     * @Title: buildBuyer
     * @author （guohao）
     * @date 2018年6月28日 下午5:10:10
     * @version V1.0
     */
    public void buildBuyer(String buyerName, String buyerAccount, String buyerPhone, String buyerIdType, String buyerIdNumber) {
        orderRequestParam.setBuyerName(buyerName);
        orderRequestParam.setBuyerAccount(buyerAccount);
        orderRequestParam.setBuyerPhone(buyerPhone);
        orderRequestParam.setBuyerIdType(buyerIdType);
        orderRequestParam.setBuyerIdNumber(buyerIdNumber);
    }

    /**
     * 构建订单金额
     *
     * @param orderTotalFee   订单总费用 BigDecimal 10,4 true
     * @param orderTotalValue 订单总货值 BigDecimal 10,4 true
     * @param shippingFee     运费 BigDecimal 10,4 false
     * @param noCashDeduction 非现金抵扣 BigDecimal 10,4 true
     * @return void    返回类型
     * @throws
     * @Title: buildPrice
     * @author （guohao）
     * @date 2018年6月28日 下午5:09:24
     * @version V1.0
     */
    public void buildPrice(BigDecimal orderTotalFee, BigDecimal orderTotalValue, BigDecimal shippingFee, BigDecimal noCashDeduction) {
        orderRequestParam.setOrderTotalFee(orderTotalFee);
        orderRequestParam.setOrderTotalValue(orderTotalValue);
        orderRequestParam.setShippingFee(shippingFee);
        orderRequestParam.setNoCashDeduction(noCashDeduction);

    }

    /**
     * 构建 税比例
     *
     * <p>
     * 应征关税税额= 完税价格*关税
     * 应征消费税税额= (（完税价格+关税税额）/(1-消费税税率)) * 消费税税率
     * 增值税= （关税完税价格+关税+消费税）* 增值税税率
     * </p>
     *
     * @param orderTotalTax 订单总税费 BigDecimal 10,4 true
     * @param tariff        关税 BigDecimal 10,4 false
     * @param saleTax       消费税 BigDecimal 10,4 true
     * @param valueAddedTax 增值税 BigDecimal 10,4 true
     * @return void    返回类型
     * @throws
     * @Title: buildTax
     * @author （guohao）
     * @date 2018年6月28日 下午5:04:47
     * @version V1.0
     */
    public void buildTax(BigDecimal orderTotalTax, BigDecimal tariff, BigDecimal saleTax, BigDecimal valueAddedTax) {
        orderRequestParam.setOrderTotalTax(orderTotalTax);
        orderRequestParam.setTariff(tariff);
        orderRequestParam.setSaleTax(saleTax);
        orderRequestParam.setValueAddedTax(valueAddedTax);

    }

    /**
     * 消费税是0，关税字段不推。增值税字段 推的是 反推的关税。
     * 总税费=消费税+关税+增值税
     */
    public void buildTax(OrderTaxes orderTaxes) {
        orderRequestParam.setOrderTotalTax(orderTaxes.getTariff().add(orderTaxes.getSaleTax()));
        //		orderRequestParam.setTariff(tariff);
        orderRequestParam.setSaleTax(orderTaxes.getSaleTax());
        orderRequestParam.setValueAddedTax(orderTaxes.getTariff());

    }

    public OrderRequestParam build() {
        return orderRequestParam;
    }
}
